package speed2010.middleware;

import java.util.Hashtable;

import speed2010.mensagem.Mensagem;
import speed2010.middleware.serviceOverlay.node.Node;

public class InterceptorDesempenhoDasMsgs {

	static private InterceptorDesempenhoDasMsgs instance = null;
	
	private Hashtable<Long, Tempos> map_IDBusca_Tempos = new Hashtable<Long, Tempos>();

	private InterceptorDesempenhoDasMsgs() {
		super();
	}

	static public InterceptorDesempenhoDasMsgs getInstance() {
		if (instance == null) {
			instance = new InterceptorDesempenhoDasMsgs();
		}
		return instance;
	}

	// Atualiza o contador de msgs
	public void atualizaGUIComMsgDeSaida(Node node, Mensagem msgDaSaida,
			String tipo) {
		if (node.getGuiConsulta() != null) {
			if(node.getGuiConsulta().getJLabelQntSaida() != null){				
				node.getGuiConsulta().getJLabelQntSaida().setText(
					(Integer.parseInt(node.getGuiConsulta().getJLabelQntSaida()
							.getText()) + 1)
							+ "");
				node.getGuiConsulta().adicionaTextoNoConsoleMsgs(
					tipo + " " + msgDaSaida.toStringNetwork());
			}
		}
	}

	// Atualiza o contador de msgs
	synchronized public void atualizaGUIComMsgDeEntrada(Node node,
			Mensagem msgDaEntrada, String tipo) {
		if (node.getGuiConsulta() != null) {
			node.getGuiConsulta().getJLabelQntEntrada().setText(
					(Integer.parseInt(node.getGuiConsulta()
							.getJLabelQntEntrada().getText()) + 1)
							+ "");
			node.getGuiConsulta().adicionaTextoNoConsoleMsgs(
					tipo + " " + msgDaEntrada.toStringNetwork());
		}
	}

	public void imprimeTemposNaGUI(long idBusca, Node node) {
		if (node.getGuiConsulta() != null) {
			if (this.getMap_ID_Tempos().containsKey(idBusca)) {
				long t1 = System.currentTimeMillis();
				long t = t1 - this.getMap_ID_Tempos().get(idBusca).getTsaida();
//				long tempoDeProcessamento = this.getMap_ID_Tempos()
//						.get(idBusca).getTfProcessamento()
//						- this.getMap_ID_Tempos().get(idBusca)
//								.getTiProcessamento() - t;
				node.getGuiConsulta().adicionaTextoNoConsoleMsgs(
						"Tempo da resposta da busca " + idBusca
								+ " recebida em: " + t
								+ " ms. ");
								//Tempo de processamento: " + tempoDeProcessamento + " ms.");
//				System.out.println("Tempo da resposta da busca " + idBusca
//								+ " recebida em: #" + t
//								+ "# ms. ");
			}
			// else {
			// Tempos temp = new Tempos();
			// temp.setTsaida(System.currentTimeMillis());
			// this.getMap_ID_Tempos().put(idBusca, temp);
			// }
		}
	}

	public Hashtable<Long, Tempos> getMap_ID_Tempos() {
		return map_IDBusca_Tempos;
	}

	public void marcaTiProcessamento(long id) {
		if (!this.getMap_ID_Tempos().containsKey(id)) {
			this.getMap_ID_Tempos().put(id, new Tempos());
		}
		this.getMap_ID_Tempos().get(id).setTiProcessamento(
				System.currentTimeMillis());
	}

	public void marcaTfProcessamento(long id) {
		if (!this.getMap_ID_Tempos().containsKey(id)) {
			this.getMap_ID_Tempos().put(id, new Tempos());
		}
		this.getMap_ID_Tempos().get(id).setTfProcessamento(
				System.currentTimeMillis());
	}

	public void marcaTSaida(long id) {
		if (!this.getMap_ID_Tempos().containsKey(id)) {
			this.getMap_ID_Tempos().put(id, new Tempos());
		}
		this.getMap_ID_Tempos().get(id).setTsaida(System.currentTimeMillis());
	}

	public void marcaTChegada(long id) {
		if (!this.getMap_ID_Tempos().containsKey(id)) {
			this.getMap_ID_Tempos().put(id, new Tempos());
		}
		this.getMap_ID_Tempos().get(id).setTchegada(System.currentTimeMillis());
	}
}

class Tempos {
	private long tsaida = -1;
	private long tchegada = -1;
	private long tiProcessamento = -1;
	private long tfProcessamento = -1;

	public Tempos() {
		super();
	}

	public long getTsaida() {
		return tsaida;
	}

	public void setTsaida(long tsaida) {
		this.tsaida = tsaida;
	}

	public long getTchegada() {
		return tchegada;
	}

	public void setTchegada(long tchegada) {
		this.tchegada = tchegada;
	}

	public long getTiProcessamento() {
		return tiProcessamento;
	}

	public void setTiProcessamento(long tiProcessamento) {
		this.tiProcessamento = tiProcessamento;
	}

	public long getTfProcessamento() {
		return tfProcessamento;
	}

	public void setTfProcessamento(long tfProcessamento) {
		this.tfProcessamento = tfProcessamento;
	}
}
